export default function(id, pId, list) {
    var row;
    var i;
    /**
     * @param {} list        list
     * @param {} pId        父节点
     * @return {Boolean}    是否存在父节点  
     * @description now.id = other.pid   other 的父节点为 noew
     */
    function exists(list, pId) {
        for (var i = 0; i < list.length; i++) {
            if (list[i][id] == pId) {
                return true;
            }
        }
        return false;
    }

    /**
     * 树节点数据  最终数据结构
     * @type  Node treeNode 
     */
    var nodes = [];


    /**
     * 将所有的节点数据装入List 
     * @type Number
     */
    for (i = 0; i < list.length; i++) {
        row = list[i];
        if (!exists(list, row[pId])) { //now.pid != new.id
            nodes.push(row); //new ids
        }
    }

    /**
     * 父节点
     * @type Node 
     */
    var pNodes = [];

    /**
     * 将所有的子节点数据装入 pNodes 
     * @type pNodes 
     */
    for (i = 0; i < nodes.length; i++) {
        pNodes.push(nodes[i]);
    }


    /**
     * 循环处理所有节点数据并进行封装 
     */
    while (pNodes.length) {

        /**
         *  把数组的第一个元素从其中删除，并返回第一个元素的值
         *  the parent node
         */
        var node = pNodes.shift();

        /**
         * 
         * get the children nodes
         */
        for (i = 0; i < list.length; i++) {
            row = list[i];
            /**
             * 取出list所有数据 比较处理
             * 
             * 这里可以定制化 Node 节点数据结构
             * {  
             *   "isActive": true, 
             *   "isRoot": true, 
             *   "title": "标题1",
             *   "children": [
             *       {
             *           "text": "内容1"
             *       }, 
             *       {
             *           "text": "内容2"
             *       }
             *   ]
             * }
             */
            if (row[pId] == node[id]) {
                /**
                 * 如果有children 直接放入
                 */
                if (node.children) {
                    node.children.push(row);
                } else {
                    node.children = [row];
                }
                pNodes.push(row);
            }
        }
    }
    return nodes;
}